home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 14 / CU Amiga Magazine's Super CD-ROM 14 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-09].iso / CUCD / Programming / IEditor / Expanders / ScrollerWindow.desc < prev    next >
Encoding:
Text File  |  1997-06-17  |  19.3 KB  |  640 lines

  1. ##RENDPRI
  2. -20
  3. ##HEADER
  4.  
  5. #ifndef IM
  6. #define IM(o) ((struct Image *) o)
  7. #endif
  8.  
  9. #ifndef GAD
  10. #define GAD(o) ((struct Gadget *) o)
  11. #endif
  12.  
  13. #ifndef MAX
  14. #define MAX(x,y) ((x) > (y) ? (x) : (y))
  15. #endif
  16.  
  17. #ifndef MIN
  18. #define MIN(x,y) ((x) < (y) ? (x) : (y))
  19. #endif
  20.  
  21. /* DICE specific */
  22. #define HOOK __geta4
  23. #define A0(stuff) __A0 stuff
  24. #define A1(stuff) __A1 stuff
  25. #define A2(stuff) __A2 stuff
  26.  
  27. #define HORIZ_GID       1
  28. #define VERT_GID        2
  29. #define LEFT_GID        3
  30. #define RIGHT_GID       4
  31. #define UP_GID          5
  32. #define DOWN_GID        6
  33.  
  34. extern int SysISize( void );
  35. extern Object *NewImageObject( ULONG );
  36. extern Object *NewPropObject( ULONG, Tag, ... );
  37. extern Object *NewButtonObject( Object *, Tag, ... );
  38. extern void NotifyAttrChanges( Object *, struct GadgetInfo *, ULONG, Tag, ... );
  39. extern ULONG HandleMyButton( struct Gadget *, struct gpInput *, struct ButtonData * );
  40. extern HOOK ULONG DispatchMyButtongClass( A0(Class *), A2(Object *), A1(struct gpInput *));
  41. extern HOOK ULONG DispatchMyPropgClass(A0(Class *), A2(Object *), A1(struct gpLayout *));
  42. extern void UpdateProp( struct Window *, Object *, ULONG, LONG );
  43. extern HOOK ULONG BFHookFunc( void );
  44.  
  45. extern struct Library           *UtilityBase;
  46. extern struct DrawInfo          *dri;
  47. extern Class                    *mypropgclass;
  48. extern Class                    *mybuttongclass;
  49. extern Object                   *SizeImage, *LeftImage, *RightImage;
  50. extern Object                   *UpImage, *DownImage;
  51.  
  52. ##SUPPORT
  53.  
  54. int SysISize( void )
  55. {
  56.         return(( Scr->Flags & SCREENHIRES ) ? SYSISIZE_MEDRES : SYSISIZE_LOWRES );
  57. }
  58.  
  59.  
  60. Object *NewImageObject( ULONG which )
  61. {
  62.         return( NewObject( NULL, SYSICLASS,
  63.                            SYSIA_DrawInfo, dri,
  64.                            SYSIA_Which, which,
  65.                            SYSIA_Size, SysISize(),
  66.                            TAG_DONE ));
  67. }
  68.  
  69. Object *NewPropObject( ULONG freedom, Tag tag1, ... )
  70. {
  71.         return( NewObject( mypropgclass, NULL,
  72.                            ICA_TARGET, ICTARGET_IDCMP,
  73.                            PGA_Freedom, freedom,
  74.                            PGA_NewLook, TRUE,
  75.                            PGA_Borderless, (( dri->dri_Flags & DRIF_NEWLOOK ) && ( dri->dri_Depth != 1 )),
  76.                            TAG_MORE, &tag1 ));
  77. }
  78.  
  79. Object *NewButtonObject( Object *image, Tag tag1, ... )
  80. {
  81.         return( NewObject( mybuttongclass, NULL,
  82.                            ICA_TARGET, ICTARGET_IDCMP,
  83.                            GA_Image, image,
  84.                            TAG_MORE, &tag1 ));
  85. }
  86.  
  87. struct ButtonData
  88. {
  89.         ULONG   TickCounter;
  90. };
  91.  
  92. struct PropData
  93. {
  94.         LONG   *Visible;
  95. };
  96.  
  97. void NotifyAttrChanges( Object *o, struct GadgetInfo *gi, ULONG flags, Tag attr1, ... )
  98. {
  99.         DoMethod( o, OM_NOTIFY, &attr1, gi, flags );
  100. }
  101.  
  102. ULONG HandleMyButton( struct Gadget *gad, struct gpInput *gpi, struct ButtonData *bd )
  103. {
  104.         UWORD            selected = 0;
  105.         struct RastPort *rp;
  106.         ULONG            retval = GMR_MEACTIVE;
  107.  
  108.         if (PointInImage((gpi->gpi_Mouse.X << 16) + (gpi->gpi_Mouse.Y), gad->GadgetRender))
  109.         {
  110.                 selected = GFLG_SELECTED;
  111.         }
  112.         if (gpi->gpi_IEvent->ie_Class == IECLASS_RAWMOUSE && gpi->gpi_IEvent->ie_Code == SELECTUP)
  113.         {
  114.                 retval = GMR_NOREUSE;
  115.                 selected = 0;
  116.         }
  117.         if (gpi->gpi_IEvent->ie_Class == IECLASS_TIMER)
  118.         {
  119.                 if (selected && !(--bd->TickCounter))
  120.                 {
  121.                         bd->TickCounter = 1;
  122.                         NotifyAttrChanges( (Object *) gad, gpi->gpi_GInfo, 0,
  123.                                            GA_ID, gad->GadgetID,
  124.                                            TAG_DONE);
  125.                 }
  126.         }
  127.         if ((gad->Flags & GFLG_SELECTED) != selected)
  128.         {
  129.                 gad->Flags ^= GFLG_SELECTED;
  130.                 if (rp = ObtainGIRPort(gpi->gpi_GInfo))
  131.                 {
  132.                         DoMethod((Object *) gad, GM_RENDER, gpi->gpi_GInfo, rp, GREDRAW_UPDATE);
  133.                         ReleaseGIRPort(rp);
  134.                 }
  135.         }
  136.         return (retval);
  137. }
  138.  
  139. HOOK ULONG DispatchMyButtongClass( A0(Class *cl), A2(Object *o), A1(struct gpInput *gpi))
  140. {
  141.         struct ButtonData *bd = (struct ButtonData *) INST_DATA(cl, o);
  142.  
  143.         switch (gpi->MethodID)
  144.         {
  145.         case GM_GOACTIVE:
  146.                 bd->TickCounter = 2;
  147.                 NotifyAttrChanges( o, gpi->gpi_GInfo, 0,
  148.                                    GA_ID, GAD(o)->GadgetID,
  149.                                    TAG_DONE );
  150.                 return (GMR_MEACTIVE);
  151.         case GM_HANDLEINPUT:
  152.                 return (HandleMyButton(GAD(o), gpi, bd));
  153.         default:
  154.                 return( DoSuperMethodA( cl, o, ( Msg ) gpi ));
  155.         }
  156. }
  157.  
  158.  
  159. #define RecalcHVisible(window) (window->GZZWidth)
  160. #define RecalcVVisible(window) (window->GZZHeight)
  161.  
  162. HOOK ULONG DispatchMyPropgClass(A0(Class *cl), A2(Object *o), A1(struct gpLayout *gpl))
  163. {
  164.         if (gpl->MethodID == GM_LAYOUT)
  165.         {
  166.                 struct Window      *win = gpl->gpl_GInfo->gi_Window;
  167.                 struct PropInfo    *pi = (struct PropInfo *)GAD(o)->SpecialInfo;
  168.                 LONG                visible;
  169.                 struct PropData    *pd = (struct PropData *)INST_DATA( cl, o );
  170.  
  171.                 if (pi->Flags & FREEHORIZ)
  172.                 {
  173.                         visible = RecalcHVisible( win );
  174.                 }
  175.                 else
  176.                 {
  177.                         visible = RecalcVVisible( win );
  178.                 }
  179.  
  180.                 *pd->Visible = visible;
  181.  
  182.                 SetAttrs( o, PGA_Visible, visible, TAG_DONE );
  183.         }
  184.  
  185.         return ( DoSuperMethodA( cl, o, (Msg) gpl ));
  186. }
  187.  
  188. void UpdateProp( struct Window *window, Object *gadget, ULONG attr, LONG value)
  189. {
  190.         if (SetAttrs(gadget, attr, value, TAG_DONE))
  191.         {
  192.                 struct PropInfo *pi = (struct PropInfo *) (GAD(gadget))->SpecialInfo;
  193.                 NewModifyProp(GAD(gadget), window, NULL, pi->Flags, pi->HorizPot, pi->VertPot, pi->HorizBody, pi->VertBody, 1);
  194.         }
  195. }
  196.  
  197.  
  198. HOOK ULONG BFHookFunc( void )
  199. {
  200.         return (1);
  201. }
  202.  
  203. static struct Hook BFHook =
  204. {
  205.         NULL, NULL,
  206.         BFHookFunc,
  207. };
  208.  
  209. #define QUAL_SHIFT      (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)
  210. #define QUAL_ALT        (IEQUALIFIER_LALT | IEQUALIFIER_RALT)
  211. #define QUAL_CTRL       (IEQUALIFIER_CONTROL)
  212.  
  213. ##SETUP
  214.  
  215.         if(!( dri = GetScreenDrawInfo( Scr )))
  216.             return( 3L );
  217.  
  218.         SizeImage   = NewImageObject( SIZEIMAGE  );
  219.         LeftImage   = NewImageObject( LEFTIMAGE  );
  220.         RightImage  = NewImageObject( RIGHTIMAGE );
  221.         UpImage     = NewImageObject( UPIMAGE    );
  222.         DownImage   = NewImageObject( DOWNIMAGE  );
  223.  
  224.         if(!( SizeImage && LeftImage && RightImage && UpImage && DownImage ))
  225.             return( 4L );
  226.  
  227.         if(!( mypropgclass = MakeClass( NULL, PROPGCLASS, NULL, sizeof( struct PropData ), 0 )))
  228.             return( 5L );
  229.  
  230.         mypropgclass->cl_Dispatcher.h_Entry = ( ULONG (*)()) DispatchMyPropgClass;
  231.  
  232.         if(!( mybuttongclass = MakeClass( NULL, BUTTONGCLASS, NULL, sizeof( struct ButtonData ), 0 )))
  233.             return( 5L );
  234.  
  235.         mybuttongclass->cl_Dispatcher.h_Entry = ( ULONG (*)()) DispatchMyButtongClass;
  236.  
  237. ##CLOSEDOWN
  238.  
  239.         DisposeObject( SizeImage  );
  240.         DisposeObject( LeftImage  );
  241.         DisposeObject( RightImage );
  242.         DisposeObject( UpImage    );
  243.         DisposeObject( DownImage  );
  244.  
  245.         SizeImage  = NULL;
  246.         LeftImage  = NULL;
  247.         RightImage = NULL;
  248.         UpImage    = NULL;
  249.         DownImage  = NULL;
  250.  
  251.         if( Scr )
  252.                 FreeScreenDrawInfo( Scr, dri );
  253.  
  254.         if( mybuttongclass ) {
  255.                 FreeClass( mybuttongclass );
  256.                 mybuttongclass = NULL;
  257.         }
  258.  
  259.         if( mypropgclass ) {
  260.                 FreeClass( mypropgclass );
  261.                 mypropgclass = NULL;
  262.         }
  263.  
  264. ##INCLUDE
  265. #ifndef EXEC_EXECBASE_H
  266. #include <exec/execbase.h>
  267. #endif
  268. #ifndef EXEC_LIBRARIES_H
  269. #include <exec/libraries.h>
  270. #endif
  271. #ifndef INTUITION_ICCLASS_H
  272. #include <intuition/icclass.h>
  273. #endif
  274. #ifndef INTUITION_CLASSUSR_H
  275. #include <intuition/classusr.h>
  276. #endif
  277. #ifndef INTUITION_IMAGECLASS_H
  278. #include <intuition/imageclass.h>
  279. #endif
  280. #ifndef CLIB_ALIB_PROTOS_H
  281. #include <clib/alib_protos.h>
  282. #endif
  283. #ifndef CLIB_UTILITY_PROTOS_H
  284. #include <clib/utility_protos.h>
  285. #endif
  286. #ifdef PRAGMAS
  287.   #ifndef PRAGMAS_UTILITY_PRAGMAS
  288.   #include <pragmas/utility_pragmas.h>
  289.   #endif
  290. #endif
  291.  
  292.  
  293. ##GLOBAL
  294. struct DrawInfo         *dri;
  295. Class                   *mypropgclass;
  296. Class                   *mybuttongclass;
  297. Object                  *SizeImage, *LeftImage, *RightImage;
  298. Object                  *UpImage, *DownImage;
  299.  
  300. ##DATA
  301. struct BitMap           *%wBitMap;
  302.  
  303. BOOL                    %wFrozen = FALSE;
  304. Object                  *%wHorizGadget, *%wVertGadget;
  305. Object                  *%wLeftGadget, *%wRightGadget;
  306. Object                  *%wUpGadget, *%wDownGadget;
  307.  
  308. LONG                    %wHTotal, %wVTotal;
  309. LONG                    %wHVisible, %wVVisible;
  310.  
  311. ##OPENWND
  312.  
  313. LONG Open%wWindow( void )
  314. {
  315.         int resolution = SysISize();
  316.         WORD topborder = YOffset + 1;
  317.         WORD w = IM( SizeImage )->Width;
  318.         WORD h = IM( SizeImage )->Height;
  319.         WORD bw = ( resolution == SYSISIZE_LOWRES ) ? 1 : 2;
  320.         WORD bh = ( resolution == SYSISIZE_HIRES  ) ? 2 : 1;
  321.         WORD rw = ( resolution == SYSISIZE_HIRES  ) ? 3 : 2;
  322.         WORD rh = ( resolution == SYSISIZE_HIRES  ) ? 2 : 1;
  323.         WORD gw, gh;
  324.         struct PropData *pd;
  325.  
  326.         gh = MAX( IM( LeftImage  )->Height, h  );
  327.         gh = MAX( IM( RightImage )->Height, gh );
  328.         gw = MAX( IM( UpImage    )->Width,  w  );
  329.         gw = MAX( IM( DownImage  )->Width,  gw );
  330.  
  331.         if(!( %wHorizGadget = NewPropObject( FREEHORIZ,
  332.                               GA_Left, rw + 1,
  333.                               GA_RelBottom, bh - gh + 2,
  334.                               GA_RelWidth, -gw - 1 - IM( LeftImage )->Width - IM( RightImage )->Width - rw - rw,
  335.                               GA_Height, gh - bh - bh - 2,
  336.                               GA_BottomBorder, TRUE,
  337.                               GA_ID, HORIZ_GID,
  338.                               PGA_Total, %wHTotal,
  339.                               PGA_Visible, %wHVisible,
  340.                               TAG_DONE )))
  341.             return( 2L );
  342.  
  343.         pd = ( struct PropData * )INST_DATA( mypropgclass, %wHorizGadget );
  344.         pd->Visible = &%wHVisible;
  345.  
  346.         if(!( %wVertGadget = NewPropObject( FREEVERT,
  347.                              GA_RelRight, bw - gw + 3,
  348.                              GA_Top, topborder + rh,
  349.                              GA_Width, gw - bw - bw - 4,
  350.                              GA_RelHeight, -topborder - h - IM( UpImage )->Height - IM( DownImage )->Height - rh - rh,
  351.                              GA_RightBorder, TRUE,
  352.                              GA_Previous, %wHorizGadget,
  353.                              GA_ID, VERT_GID,
  354.                              PGA_Total, %wVTotal,
  355.                              PGA_Visible, %wVVisible,
  356.                              TAG_DONE )))
  357.             return( 2L );
  358.  
  359.         pd = ( struct PropData * )INST_DATA( mypropgclass, %wVertGadget );
  360.         pd->Visible = &%wVVisible;
  361.  
  362.         if(!( %wLeftGadget = NewButtonObject( LeftImage,
  363.                              GA_RelRight, 1 - IM( LeftImage )->Width - IM( RightImage )->Width - gw,
  364.                              GA_RelBottom, 1 - IM( LeftImage )->Height,
  365.                              GA_BottomBorder, TRUE,
  366.                              GA_Previous, %wVertGadget,
  367.                              GA_ID, LEFT_GID,
  368.                              TAG_DONE )))
  369.             return( 2L );
  370.  
  371.         if(!( %wRightGadget = NewButtonObject( RightImage,
  372.                               GA_RelRight, 1 - IM( RightImage )->Width - gw,
  373.                               GA_RelBottom, 1 - IM( RightImage )->Height,
  374.                               GA_BottomBorder, TRUE,
  375.                               GA_Previous, %wLeftGadget,
  376.                               GA_ID, RIGHT_GID,
  377.                               TAG_DONE )))
  378.             return( 2L );
  379.  
  380.         if(!( %wUpGadget = NewButtonObject( UpImage,
  381.                            GA_RelRight, 1 - IM( UpImage )->Width,
  382.                            GA_RelBottom, 1 - IM( UpImage )->Height - IM( DownImage )->Height - h,
  383.                            GA_RightBorder, TRUE,
  384.                            GA_Previous, %wRightGadget,
  385.                            GA_ID, UP_GID,
  386.                            TAG_DONE )))
  387.             return( 2L );
  388.  
  389.         if(!( %wDownGadget = NewButtonObject( DownImage,
  390.                              GA_RelRight, 1 - IM( DownImage )->Width,
  391.                              GA_RelBottom, 1 - IM( DownImage )->Height - h,
  392.                              GA_RightBorder, TRUE,
  393.                              GA_Previous, %wUpGadget,
  394.                              GA_ID, DOWN_GID,
  395.                              TAG_DONE )))
  396.             return( 2L );
  397.  
  398. ##OPENWND-LOCALE
  399.  
  400.         if(!( Localized[ %n ] )) {
  401.  
  402.             %wWTags[ 9 ].ti_Data = (ULONG)CatCompArray[ %wWTags[ 9 ].ti_Data ].cca_Str;
  403.  
  404. ##OPENWND-LOCALE-MENUS
  405.  
  406.             LocalizeMenus( &%wNewMenu[0] );
  407.  
  408. ##OPENWND-LOCALE-2
  409.  
  410.             Localized[ %n ] = TRUE;
  411.         }
  412.  
  413. ##OPENWND-MENUS
  414.  
  415.         if(!( %wMenus = CreateMenus( %wNewMenu, TAG_END )))
  416.                 return( 5L );
  417.  
  418.         LayoutMenus( %wMenus, VisualInfo, GTMN_NewLookMenus, TRUE, TAG_END );
  419.  
  420. ##OPENWND-2
  421.  
  422.         %wWTags[4].ti_Data = MAX( 80, gw + 1 + IM(LeftImage)->Width + IM(RightImage)->Width + rw + rw + KNOBHMIN );
  423.         %wWTags[6].ti_Data = MAX(50, topborder + h + IM(UpImage)->Height + IM(DownImage)->Height + rh + rh + KNOBVMIN);
  424.         %wWTags[8].ti_Data = Scr;
  425.  
  426.         if(!( %wWnd = OpenWindowTags( NULL,
  427.                                       WA_Gadgets, %wHorizGadget,
  428.                                       WA_BackFill, &BFHook,
  429.                                       TAG_MORE, %wWTags )))
  430.             return( 4L );
  431.  
  432. ##OPENWND-MENUS-2
  433.  
  434.         SetMenuStrip( %wWnd, %wMenus );
  435.  
  436. ##OPENWND-END
  437.  
  438.         Update%wSWindow();
  439.  
  440.         return( 0L );
  441. }
  442.  
  443. void Update%wBitMap( void )
  444. {
  445.         ULONG srcx, srcy;
  446.  
  447.         if (!%wFrozen) {
  448.                 UWORD   srcx2;
  449.  
  450.                 GetAttr(PGA_Top, %wHorizGadget, &srcx);
  451.                 GetAttr(PGA_Top, %wVertGadget, &srcy);
  452.  
  453.                 srcx2 = ( srcx & 0xFFF0 ) >> 3;
  454.  
  455.                 BltTemplate( ViewBitMap->Planes[0] + ( srcy * ViewBitMap->BytesPerRow ) + srcx2,
  456.                              srcx - ( srcx2 << 3 ),
  457.                              ViewBitMap->BytesPerRow,
  458.                              ViewWnd->RPort,
  459.                              ViewWnd->BorderLeft, ViewWnd->BorderTop,
  460.                              MIN( ViewHTotal, ViewHVisible ), MIN( ViewVTotal, ViewVVisible));
  461.         }
  462. }
  463.  
  464. void Update%wSWindow( void )
  465. {
  466.         if( SysBase->LibNode.lib_Version < 39 ) {
  467.                 %wHVisible = RecalcHVisible( %wWnd );
  468.                 UpdateProp( %wWnd, %wHorizGadget, PGA_Visible, %wHVisible );
  469.                 %wVVisible = RecalcVVisible( %wWnd );
  470.                 UpdateProp( %wWnd, %wVertGadget, PGA_Visible, %wVVisible );
  471.         }
  472.  
  473.         if (!%wFrozen) {
  474.             SetAPen( %wWnd->RPort, 0 );
  475.             RectFill( %wWnd->RPort,
  476.                       %wWnd->BorderLeft + 1, %wWnd->BorderTop,
  477.                       %wWnd->Width - %wWnd->BorderRight - 1,
  478.                       %wWnd->Height - %wWnd->BorderBottom - 1 );
  479.         }
  480.  
  481.         SetAPen( ViewWnd->RPort, 1 );
  482.  
  483.         Update%wBitMap();
  484. }
  485.  
  486. void %wScrollerLeft(LONG amount)
  487. {
  488.         LONG oldtop;
  489.  
  490.         GetAttr(PGA_Top, %wHorizGadget, (ULONG *) &oldtop);
  491.         if (oldtop > 0)
  492.         {
  493.                 UpdateProp( %wWnd, %wHorizGadget, PGA_Top, MAX(0, oldtop - amount));
  494.                 Update%wBitMap();
  495.         }
  496. }
  497.  
  498. void %wScrollerRight(LONG amount)
  499. {
  500.         LONG oldtop;
  501.  
  502.         GetAttr(PGA_Top, %wHorizGadget, (ULONG *) &oldtop);
  503.         if (oldtop < %wHTotal - %wHVisible)
  504.         {
  505.                 UpdateProp( %wWnd, %wHorizGadget, PGA_Top, MIN( %wHTotal - %wHVisible, oldtop + amount));
  506.                 Update%wBitMap();
  507.         }
  508. }
  509.  
  510. void %wScrollerUp(LONG amount)
  511. {
  512.         LONG oldtop;
  513.  
  514.         GetAttr(PGA_Top, %wVertGadget, (ULONG *) &oldtop);
  515.         if (oldtop > 0)
  516.         {
  517.                 UpdateProp( %wWnd, %wVertGadget, PGA_Top, MAX(0, oldtop - amount));
  518.                 Update%wBitMap();
  519.         }
  520. }
  521.  
  522. void %wScrollerDown(LONG amount)
  523. {
  524.         LONG oldtop;
  525.  
  526.         GetAttr(PGA_Top, %wVertGadget, (ULONG *) &oldtop);
  527.         if (oldtop < %wVTotal - %wVVisible)
  528.         {
  529.                 UpdateProp( %wWnd, %wVertGadget, PGA_Top, MIN( %wVTotal - %wVVisible, oldtop + amount));
  530.                 Update%wBitMap();
  531.         }
  532. }
  533.  
  534. BOOL %wRawKey( void )
  535. {
  536.         switch( %wMsg.Code )
  537.         {
  538.         case CURSORLEFT:
  539.                 if( %wMsg.Qualifier & QUAL_CTRL ) %wScrollerLeft( %wHTotal );
  540.                 else if( %wMsg.Qualifier & QUAL_SHIFT) %wScrollerLeft( %wHVisible - 1 );
  541.                 else if( %wMsg.Qualifier & QUAL_ALT) %wScrollerLeft( 16 );
  542.                 else %wScrollerLeft( 1 );
  543.                 break;
  544.         case CURSORRIGHT:
  545.                 if (%wMsg.Qualifier & QUAL_CTRL) %wScrollerRight( %wHTotal);
  546.                 else if (%wMsg.Qualifier & QUAL_SHIFT) %wScrollerRight( %wHVisible - 1);
  547.                 else if (%wMsg.Qualifier & QUAL_ALT) %wScrollerRight( 16 );
  548.                 else %wScrollerRight( 1 );
  549.                 break;
  550.         case CURSORUP:
  551.                 if (%wMsg.Qualifier & QUAL_CTRL) %wScrollerUp( %wVTotal );
  552.                 else if (%wMsg.Qualifier & QUAL_SHIFT) %wScrollerUp( %wVVisible - 1 );
  553.                 else if (%wMsg.Qualifier & QUAL_ALT) %wScrollerUp( 16 );
  554.                 else %wScrollerUp( 1 );
  555.                 break;
  556.         case CURSORDOWN:
  557.                 if (%wMsg.Qualifier & QUAL_CTRL) %wScrollerDown( %wVTotal);
  558.                 else if (%wMsg.Qualifier & QUAL_SHIFT) %wScrollerDown( %wVVisible - 1);
  559.                 else if (%wMsg.Qualifier & QUAL_ALT) %wScrollerDown( 16 );
  560.                 else %wScrollerDown( 1 );
  561.                 break;
  562.         }
  563.  
  564.         return( TRUE );
  565. }
  566.  
  567. BOOL %wIDCMPUpdate( void )
  568. {
  569.         struct TagItem *attrs = (struct TagItem *)%wMsg.IAddress;
  570.  
  571.         switch (GetTagData(GA_ID, 0, attrs))
  572.         {
  573.         case HORIZ_GID:
  574.         case VERT_GID:
  575.                 Update%wBitMap();
  576.                 break;
  577.         case LEFT_GID:
  578.                 %wScrollerLeft( 1 );
  579.                 break;
  580.         case RIGHT_GID:
  581.                 %wScrollerRight( 1 );
  582.                 break;
  583.         case UP_GID:
  584.                 %wScrollerUp( 1 );
  585.                 break;
  586.         case DOWN_GID:
  587.                 %wScrollerDown( 1 );
  588.                 break;
  589.         }
  590.  
  591.         return( TRUE );
  592. }
  593.  
  594. BOOL %wSizeVerify( void )
  595. {
  596.         %wFrozen = TRUE;
  597.         return( TRUE );
  598. }
  599.  
  600. BOOL %wNewSize( void )
  601. {
  602.         %wFrozen = FALSE;
  603.         Update%wSWindow();
  604.         return( TRUE );
  605. }
  606.  
  607.  
  608. ##CLOSEWND
  609.  
  610.         DisposeObject( %wHorizGadget );
  611.         DisposeObject( %wVertGadget );
  612.         DisposeObject( %wLeftGadget );
  613.         DisposeObject( %wRightGadget );
  614.         DisposeObject( %wUpGadget );
  615.         DisposeObject( %wDownGadget );
  616.  
  617.         %wHorizGadget = NULL;
  618.         %wVertGadget  = NULL;
  619.         %wLeftGadget  = NULL;
  620.         %wRightGadget = NULL;
  621.         %wUpGadget    = NULL;
  622.         %wDownGadget  = NULL;
  623.  
  624. ##EXTERN
  625. extern struct BitMap *%wBitMap;
  626. extern LONG %wHTotal, %wVTotal, %wHVisible, %wVVisible;
  627. extern Object *%wHorizGadget, *%wVertGadget;
  628. extern void Update%wBitMap( void );
  629. extern void Update%wSWindow( void );
  630. extern void %wScrollerLeft( LONG );
  631. extern void %wScrollerRight( LONG );
  632. extern void %wScrollerUp( LONG );
  633. extern void %wScrollerDown( LONG );
  634.  
  635. ##RENDER
  636.  
  637.         Update%wBitMap();
  638.  
  639. ##end
  640.